import std.json : JSONValue;
import std.functional : toDelegate;

import archttp;
import hunt.jwt.JwtToken;
import hunt.jwt.Exceptions;

import controller.TeleplayController;
import controller.TeleplayVlinkController;
import controller.MovieController;
import controller.MovieVlinkController;
import controller.AnimationController;
import controller.AnimationVlinkController;
import controller.AnnualReviewController;
import controller.CollectController;
import controller.LoginController;
import controller.PlaylinkController;
import controller.SearchController;

import middleware.Corss : corss;
import middleware.CheckJwt : checkToken;

import utils.RespData;
import utils.ConstValue : Const;
import utils.SecurityVerification : timeStampValidator;

// import std.stdio;

void main ()
{
    auto app = new Archttp();

    // 初始化控制器--------------------------------------------
    // 实例化电视剧控制器
    auto teleplayCtr = new TeleplayController();
    // 实例化电视剧链接控制器
    auto tLinkCtr = new TeleplayVlinkController();
    // 实例化电影控制器
    auto movieCtr = new MovieController();
    // 实例化电影链接控制器
    auto mLinkCtr = new MovieVlinkController();
    // 实例化动漫控制器
    auto animationCtr = new AnimationController();
    // 实例化动漫链接控制器
    auto aLinkCtr = new AnimationVlinkController();

    // 实例化年度点评控制器
    auto annualReviewCtr = new AnnualReviewController();

    // 实例化视频播放链接控制器
    auto playlinkCtr = new PlaylinkController();

    // 实例化采集控制器
    auto collectCtr = new CollectController();

    // 实例化搜索控制器
    auto searchCtr = new SearchController();

    // 实例化登录控制器
    auto loginCtr = new LoginController();
    // 初始化控制器end------------------------------------------

    // time检查中间件
    app.use(toDelegate(&timeStampValidator));

    // api路由组-----------------------------------------------------------------------------------
    auto apiRouter = Archttp.newRouter();
    app.use("/api", apiRouter);

    // 登录
    apiRouter.post("/login", toDelegate(&loginCtr.login));
    // 退出登录
    apiRouter.Delete("/logout", toDelegate(&loginCtr.logout));

    // 获取全部电视剧（年份分组）
    apiRouter.get("/teleplay/all", toDelegate(&teleplayCtr.getAllList));
    // 获取全部电视剧
    apiRouter.get("/teleplay/listall", toDelegate(&teleplayCtr.getListAll));
    // 分页获取电视剧数据
    apiRouter.get("/teleplay", toDelegate(&teleplayCtr.getList));
    // 获取电视剧全部年份
    apiRouter.get("/teleplay/years", toDelegate(&teleplayCtr.getYears));
    // 获取单个电视剧的播放连接列表
    apiRouter.get("/teleplay/vlist", toDelegate(&teleplayCtr.getVideoLinks));
    // 获取单个电视剧
    apiRouter.get("/teleplay/{id}", toDelegate(&teleplayCtr.getOne));

    // 获取全部电影（年份分组）
    apiRouter.get("/movie/all", toDelegate(&movieCtr.getAllList));
    // 获取全部电影
    apiRouter.get("/movie/listall", toDelegate(&movieCtr.getListAll));
    // 分页获取电影数据
    apiRouter.get("/movie", toDelegate(&movieCtr.getList));
    // 获取电影全部年份
    apiRouter.get("/movie/years", toDelegate(&movieCtr.getYears));
    // 获取单个电影的播放连接列表
    apiRouter.get("/movie/vlist", toDelegate(&movieCtr.getVideoLinks));
    // 获取单个电影
    apiRouter.get("/movie/{id}", toDelegate(&movieCtr.getOne));

    // 获取全部动漫（年份分组）
    apiRouter.get("/animation/all", toDelegate(&animationCtr.getAllList));
    // 获取全部动漫
    apiRouter.get("/animation/listall", toDelegate(&animationCtr.getListAll));
    // 分页获取动漫数据
    apiRouter.get("/animation", toDelegate(&animationCtr.getList));
    // 获取动漫全部年份
    apiRouter.get("/animation/years", toDelegate(&animationCtr.getYears));
    // 获取单个动漫的播放连接列表
    apiRouter.get("/animation/vlist", toDelegate(&animationCtr.getVideoLinks));
    // 获取单个动漫
    apiRouter.get("/animation/{id}", toDelegate(&animationCtr.getOne));

    // 获取全部年度点评列表数据
    apiRouter.get("/annualreview/all", toDelegate(&annualReviewCtr.getAllList));
    // 获取年度点评列表数据
    apiRouter.get("/annualreview", toDelegate(&annualReviewCtr.getList));

    // 视频播放地址解析
    apiRouter.post("/playlink", toDelegate(&playlinkCtr.parsePlaylink));

    // 首页搜索
    apiRouter.get("/search", toDelegate(&searchCtr.search));

    // api路由组end--------------------------------------------------------------------------------

    // admin路由组-----------------------------------------------------------
    auto adminRouter = Archttp.newRouter();
    app.use("/admin", adminRouter);

    // token检查中间件
    adminRouter.use(toDelegate(&checkToken));

    // 添加电视剧
    adminRouter.post("/teleplay/add", toDelegate(&teleplayCtr.addTeleplay));
    // 编辑电视剧
    adminRouter.put("/teleplay/edit/{id:\\w+}", toDelegate(&teleplayCtr.editTeleplay));
    // 删除一个电视剧
    adminRouter.Delete("/teleplay/{id:\\w+}", toDelegate(&teleplayCtr.deleteTeleplay));
    // 写电视剧评语
    adminRouter.post("/teleplay/comment/{id:\\w+}", toDelegate(&teleplayCtr.doComment));
    // 添加电视剧视频链接
    adminRouter.post("/tlink/add", toDelegate(&tLinkCtr.addLink));
    // 编辑电视剧视频链接
    adminRouter.put("/tlink/{id:\\d+}", toDelegate(&tLinkCtr.editLink));
    // 删除一个电视剧视频链接
    adminRouter.Delete("/tlink/{id:\\d+}", toDelegate(&tLinkCtr.removeLink));

    // 添加电影
    adminRouter.post("/movie/add", toDelegate(&movieCtr.addMovie));
    // 编辑电影
    adminRouter.put("/movie/edit/{id:\\w+}", toDelegate(&movieCtr.editMovie));
    // 删除一个电影
    adminRouter.Delete("/movie/{id:\\w+}", toDelegate(&movieCtr.deleteMovie));
    // 写电影评语
    adminRouter.post("/movie/comment/{id:\\w+}", toDelegate(&movieCtr.doComment));
    // 添加电影视频链接
    adminRouter.post("/mlink/add", toDelegate(&mLinkCtr.addLink));
    // 编辑电影视频链接
    adminRouter.put("/mlink/{id:\\d+}", toDelegate(&mLinkCtr.editLink));
    // 删除一个电影视频链接
    adminRouter.Delete("/mlink/{id:\\d+}", toDelegate(&mLinkCtr.removeLink));

    // 添加动漫
    adminRouter.post("/animation/add", toDelegate(&animationCtr.addAnimation));
    // 编辑动漫
    adminRouter.put("/animation/edit/{id:\\w+}", toDelegate(&animationCtr.editAnimation));
    // 删除一个动漫
    adminRouter.Delete("/animation/{id:\\w+}", toDelegate(&animationCtr.deleteAnimation));
    // 写动漫评语
    adminRouter.post("/animation/comment/{id:\\w+}", toDelegate(&animationCtr.doComment));
    // 添加动漫视频链接
    adminRouter.post("/alink/add", toDelegate(&aLinkCtr.addLink));
    // 编辑动漫视频链接
    adminRouter.put("/alink/{id:\\d+}", toDelegate(&aLinkCtr.editLink));
    // 删除一个动漫视频链接
    adminRouter.Delete("/alink/{id:\\d+}", toDelegate(&aLinkCtr.deleteLink));

    // 添加年度点评
    adminRouter.post("/annualreview/add", toDelegate(&annualReviewCtr.addAnnualReview));
    // 编辑年度点评
    adminRouter.put("/annualreview/{id:\\d+}", toDelegate(&annualReviewCtr.editAnnualReview));
    // 删除年度点评
    adminRouter.Delete("/annualreview/{id:\\d+}", toDelegate(&annualReviewCtr.deleteAnnualReview));

    // 采集视频信息
    adminRouter.post("/collect", toDelegate(&collectCtr.collect));
    // admin路由end-----------------------------------------------------------------

    // 启动
    app.bind("127.0.0.1", 7878).run();
}
